﻿Imports System.IO
Public Class GestionOferta
    'ruta del del directoryPath de nuestra aplicacion donde se encuentran los archivos
    Private ruta As String = My.Application.Info.DirectoryPath
    'Lista de ofertas
    Private _Ofertas As New List(Of Oferta)

    ''' <summary>
    ''' Ofertas que tenemos en nuestro sistema
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public ReadOnly Property Ofertas As ObjectModel.ReadOnlyCollection(Of Oferta)
        Get
            Return _Ofertas.AsReadOnly
        End Get
    End Property

    ''' <summary>
    ''' Constructor que extrae las ofertas del fichero Ofertas.txt
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub New()
        Try
            If Not File.Exists(ruta & "\Ofertas.txt") Then Exit Sub
            Dim fichero As StreamReader = Nothing
            Try
                fichero = New StreamReader(ruta & "\Ofertas.txt")
                Do Until fichero.EndOfStream
                    Dim linea As String = fichero.ReadLine
                    Dim datos() As String = linea.Split("*")
                    AñadirLista(New Oferta(datos(0), datos(1), Decimal.Parse(datos(2)), Date.Parse(datos(3)), Integer.Parse(datos(4))))
                Loop
            Catch ex As Exception
                _Ofertas.Clear()
            Finally
                fichero.Close()
            End Try
        Catch ex As Exception

        End Try
    End Sub

    ''' <summary>
    ''' Nos dan la Oferta que debemos agregar a la Lista
    ''' </summary>
    ''' <param name="oferta">Nombre oferta</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function AñadirLista(ByVal oferta As Oferta) As String
        If oferta Is Nothing Then Return "No se puede añadir. No existe oferta"
        If oferta.Nombre = "" Then Return "Nombre vacio"
        If oferta.Producto = "" Then Return "Producto vacio"
        If oferta.Precio <= 0 Then Return "Precio vacio"
        If oferta.Fecha < Today Then Return "Fecha vacia"
        If oferta.Cantidad <= 0 Then Return "Cantidad vacia"
        If _Ofertas.Contains(oferta) AndAlso _Ofertas.Count > 1 Then Return "Oferta ya contemplada"

        _Ofertas.Add(oferta)
        Return ""
    End Function

    ''' <summary>
    ''' Borrar una Oferta
    ''' </summary>
    ''' <param name="nombre">Nombre oferta</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Borrar(ByVal nombre As String) As String
        Dim men As String = BorrarLista(nombre)
        If men = "" Then Grabar()
        Return men
    End Function

    ''' <summary>
    ''' Grabamos la lista en el archivo Ofertas.txt
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function Grabar() As String
        Dim fichero As StreamWriter = Nothing
        Try
            fichero = New StreamWriter(ruta & "\Ofertas.txt")
            For Each ofer In _Ofertas
                fichero.WriteLine(ofer.Nombre & "*" & ofer.Producto & "*" & ofer.Precio & "*" & ofer.Fecha & "*" & ofer.Cantidad)
            Next
            fichero.Close()
        Catch ex As Exception
            fichero.Close()
            Return ex.Message
        End Try
        Return ""
    End Function
    ''' <summary>
    ''' Nos dan la Oferta que debemos agregar a la Lista
    ''' </summary>
    ''' <param name="ofer">Nombre oferta</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Añadir(ByVal ofer As Oferta) As String
        Dim men As String = AñadirLista(ofer)
        If men = "" Then Grabar()
        Return men
    End Function
    ''' <summary>
    ''' Modificar una Oferta en la lista
    ''' </summary>
    ''' <param name="ofertaNueva">Nombre oferta nueva</param>
    ''' <param name="nombreBorrar">Nombre oferta a modificar</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function ModificarEnLista(ByVal ofertaNueva As Oferta, ByVal nombreBorrar As String) As String
        Dim ofertaVieja As New Oferta(nombreBorrar, "", 1, Today, 1)
        If ofertaNueva Is Nothing OrElse ofertaVieja Is Nothing Then Return "No se puede agregar"
        If Not _Ofertas.Contains(ofertaVieja) Then Return "No existe el/la" & ofertaVieja.GetType.Name & " de nombre " & ofertaVieja.Nombre
        Dim index As Integer = _Ofertas.IndexOf(ofertaVieja)
        _Ofertas(index).Nombre = ofertaNueva.Nombre
        _Ofertas(index).Producto = ofertaNueva.Producto
        _Ofertas(index).Precio = ofertaNueva.Precio
        _Ofertas(index).Fecha = ofertaNueva.Fecha
        _Ofertas(index).Cantidad = ofertaNueva.Cantidad

        Return ""
    End Function

    ''' <summary>
    ''' Graba el cambio en la oferta
    ''' </summary>
    ''' <param name="ofertaModificada">Nombre oferta ya modificada</param>
    ''' <param name="NombreOfertAntigua">Nombre oferta antigua</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function Modificar(ByVal ofertaModificada As Oferta, ByVal NombreOfertAntigua As String) As String
        Dim men As String = ModificarEnLista(ofertaModificada, NombreOfertAntigua)
        If men = "" Then Grabar()
        Return men
    End Function
    ''' <summary>
    ''' Borrar Lista Ofertas
    ''' </summary>
    ''' <param name="nombre">Nombre de la oferta</param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Function BorrarLista(ByVal nombre As String) As String
        Dim ofer As New Oferta(nombre, "", 1, Today, 1)
        If Not _Ofertas.Contains(ofer) Then Return "No existe la oferta " & nombre
        ofer = _Ofertas(_Ofertas.IndexOf(ofer))
        _Ofertas.Remove(ofer)
        Return ""
    End Function

End Class
